package com.zhongge.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zhongge.entity.PageData;
import com.zhongge.entity.Student;
import com.zhongge.mapper.StudentMapper;
import com.zhongge.service.StudentService;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @ClassName StudentServiceImpl
 * @Description TODO
 * @Author zhongge
 * @Version 1.0
 */
@Service
public class StudentServiceImpl implements StudentService {
    @Resource
    private StudentMapper studentMapper;
    @Override
    public PageData pageSelect(Integer pageNum, Integer pageSize) {
        //第一步：在查询之前开启分页
        PageHelper.startPage(pageNum, pageSize);//启动分页
        //第二步：查询
        List<Student> students = studentMapper.selectStudentAll();
        //第三步：根据查询结果 创建 分页信息对象
        PageInfo<Student> studentPageInfo = new PageInfo<>(students);
        //第四步：根据分页信息对象 将分页信息封装并返回
        PageData pageData = new PageData();
        pageData.setTotal(studentPageInfo.getTotal());//总数
        pageData.setRows(studentPageInfo.getList());//记录数目
        return pageData;
    }

    @Override
    public Student selectStudentById(Integer id) {
        return studentMapper.selectStudentById(id);
    }

    @Override
    @Transactional//添加事务
    public Map<String, Object> addStudent(Student student) {
        //由于我们的数据表中存在一个student_no是一个唯一键，那么此时这个键值的值是不可以重复的==》于是我们就会出现一个问题
        //当我们调用这个添加方法的时候就会抛出一个异常，此时这个异常就是唯一键异常，所以我们在处理的时候也要处理一下这个异常
        Map<String, Object> map = new HashMap<>();
        try {
            boolean b = studentMapper.addStudent(student);
            if (b){
                map.put("message","添加成功√");
                map.put("success",true);
            }else {
                map.put("message","添加失败×");
                map.put("success",false);
            }
        }catch (DuplicateKeyException duplicateKeyException){
            map.put("message","学号已存在！请更换学号后重试~~");
            map.put("success",false);
        }catch (Exception e){
            map.put("message","系统异常，请稍后重试~~");
            map.put("success",false);
        }
        return map;
    }

    @Override
    @Transactional//注意：如果在这里去添加事务的时候注意他的机制：
    // 事务是等到出异常之后会回滚，那如果你在此时给他捕获了的话，那么就不会抛出异常
    //导致我们的事务接收不到这个异常，导致不会回滚
    public Map<String, Object> updateStudent(Student student) {
        Map<String, Object> map = new HashMap<>();
        int b = studentMapper.updateStudent(student);
        System.out.println(1/0);
        if (b > 0){
            map.put("message","修改成功√");
            map.put("success",true);
        }else {
            map.put("message","修改失败×");
            map.put("success",false);
        }
        return map;
    }


    @Override
    @Transactional
    public Map<String, Object> deleteStudent(Integer id) {
        Map<String, Object> map = new HashMap<>();
        boolean b = studentMapper.deleteStudent(id);
        if (b){
            map.put("message","删除成功√");
            map.put("success",true);
        }else {
            map.put("message","删除失败×");
            map.put("success",false);
        }
        return map;
    }
}
